স্প্রিং বুট ORM-এ Lazy Loading হলো ডেটাবেস থেকে শুধুমাত্র প্রয়োজনীয় ডেটা লোড করার একটি কৌশল। এটি পারফরম্যান্স অপ্টিমাইজ করার জন্য ব্যবহৃত হয়। Lazy Loading ডেটাবেস থেকে ডেটা তখনই রিট্রিভ করে, যখন সেটি অ্যাপ্লিকেশন কোডে সত্যিকারভাবে প্রয়োজন হয়।
Lazy Loading কী?
Lazy Loading হলো একটি ডেটা-লোডিং স্ট্র্যাটেজি, যেখানে সম্পর্কিত ডেটা বা অ্যাসোসিয়েশন (Associations) তখনই লোড হয়, যখন সেটি অ্যাক্সেস করা হয়। এর বিপরীতে, Eager Loading সব সম্পর্কিত ডেটা একবারেই লোড করে।
উদাহরণ:
একটি User এবং Orders এর মধ্যে এক-থেকে-অনেক (One-to-Many) সম্পর্ক রয়েছে। Lazy Loading ব্যবহার করলে Orders তখনই লোড হবে, যখন সরাসরি user.getOrders() মেথড কল করা হবে।
স্প্রিং বুটে Lazy Loading কনফিগারেশন
Lazy Loading সক্রিয় করতে Hibernate এবং JPA ডিফল্ট কনফিগারেশন ব্যবহার করে। এটি সাধারণত @OneToMany, @ManyToOne, বা অন্যান্য অ্যাসোসিয়েশন এনোটেশনের মাধ্যমে কনফিগার করা হয়।
উদাহরণ: Lazy Loading এনোটেশন
Entity: User
import jakarta.persistence.*;
import java.util.List;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY) // Lazy Loading
private List<Order> orders;
// Getters and Setters
}
Entity: Order
import jakarta.persistence.*;
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String product;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
// Getters and Setters
}
Lazy Loading এর কার্যপ্রক্রিয়া
Lazy Loading লোডিং প্যাটার্ন
User user = userRepository.findById(1L).orElse(null);
// Orders তখনই লোড হবে, যখন getOrders() কল করা হবে
List<Order> orders = user.getOrders();
Lazy Loading SQL ট্রেস
userRepository.findById()কল করলেUser-এর জন্য একটি সিলেক্ট কোয়েরি চলবে।user.getOrders()কল করলে অন্য একটি কোয়েরি চালিয়েOrdersরিট্রিভ হবে।
Eager Loading-এর তুলনা
Eager Loading-এ userRepository.findById()-এ User এবং Orders উভয়ের জন্যই একবারেই কোয়েরি চালানো হয়।
Lazy Loading ব্যবহারের সুবিধা
- পারফরম্যান্স অপ্টিমাইজেশন
বড় এবং কমপ্লেক্স ডেটা লোড না করে শুধুমাত্র প্রয়োজনীয় ডেটা লোড করা যায়, যা মেমোরি ব্যবহারে কার্যকর। - ডেটাবেস লোড কমানো
প্রাথমিক পর্যায়ে সব ডেটা লোড না করার কারণে ডেটাবেসে অপ্রয়োজনীয় লোড কমে যায়। - ফ্লেক্সিবিলিটি
Lazy Loading ব্যবহার করে সম্পর্কিত ডেটা তখনই লোড করা যায়, যখন অ্যাপ্লিকেশনের লজিকে প্রয়োজন।
Lazy Loading ব্যবহারে সতর্কতা
LazyInitializationException
যদি Hibernate Session বন্ধ হয়ে যায় এবং তারপর Lazy লোড করা ডেটা অ্যাক্সেস করার চেষ্টা করা হয়, তবে LazyInitializationException দেখা দেয়।সমাধান:
Transaction Management ব্যবহার করুন:
Lazy ডেটা লোড করার সময় ট্রানজ্যাকশন সক্রিয় রাখুন।@Transactional public List<Order> getUserOrders(Long userId) { User user = userRepository.findById(userId).orElse(null); return user.getOrders(); }- DTO বা Projections ব্যবহার করুন:
Lazy লোডিংয়ের পরিবর্তে প্রয়োজনীয় ডেটা সরাসরি রিট্রিভ করার জন্য DTO ব্যবহার করতে পারেন।
অতিরিক্ত কোয়েরি
অনেক Lazy ফিল্ড অ্যাক্সেস করলে একাধিক ডাটাবেস কোয়েরি চালানোর কারণে পারফরম্যান্সে প্রভাব পড়তে পারে।সমাধান:
Batch Fetching ব্যবহার করুন:
Hibernate এর batch_size কনফিগার করে Lazy ডেটা একাধিক রেকর্ডে একবারে লোড করতে পারেন।spring.jpa.properties.hibernate.default_batch_fetch_size=10
Lazy Loading এবং Eager Loading এর তুলনা
| Lazy Loading | Eager Loading |
|---|---|
| প্রয়োজনীয় ডেটা তখনই লোড হয়, যখন সেটি অ্যাক্সেস করা হয়। | সব সম্পর্কিত ডেটা একবারেই লোড হয়। |
| পারফরম্যান্স অপ্টিমাইজেশনের জন্য কার্যকর। | বড় ডেটাসেটের ক্ষেত্রে মেমোরি লোড বেশি। |
| অতিরিক্ত কোয়েরি তৈরি হতে পারে। | কম কোয়েরি তৈরি হয়। |
সারাংশ
Lazy Loading ডেটাবেস অপারেশনে কর্মক্ষমতা (Performance) উন্নত করার একটি কার্যকরী পদ্ধতি, বিশেষত যখন বড় ডেটাসেট বা কমপ্লেক্স রিলেশন নিয়ে কাজ করা হয়। তবে এটি ব্যবহারে সতর্কতা প্রয়োজন, কারণ অযথা LazyInitializationException বা অতিরিক্ত কোয়েরি চালানোর সমস্যা হতে পারে। সঠিক ট্রানজ্যাকশন ম্যানেজমেন্ট এবং Hibernate-এর কনফিগারেশন অপ্টিমাইজেশনের মাধ্যমে Lazy Loading কার্যকরভাবে ব্যবহার করা যায়।
Read more